package com.turbo.cloud.contract.web.logic;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.turbo.cloud.contract.constants.ContractConstants;
import com.turbo.cloud.contract.web.entity.CtContractTemplate;
import com.turbo.cloud.contract.web.model.template.CtContractTemplateQO;
import com.turbo.cloud.contract.web.model.template.CtContractTemplateDO;
import com.turbo.cloud.contract.web.model.template.CtContractTemplateVO;
import com.turbo.cloud.contract.web.service.CtContractTemplateService;
import com.turbo.cloud.core.base.PageQuery;
import com.turbo.cloud.core.exception.BusinessException;
import com.turbo.cloud.core.utils.PageQueryUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.util.Objects;

/**
 * <p>
 * 合同模板 逻辑处理类
 * </p>
 *
 * @author zhangluning
 */
@Slf4j
@RequiredArgsConstructor
@Component
public class TemplateLogic {

    final CtContractTemplateService ctContractTemplateService;
    /**
     * 查询表单列表
     *
     * @param pageQuery 查询表单条件
     * @return Page
     */
    public PageQuery<CtContractTemplateVO> queryContractTemplatePage(PageQuery<CtContractTemplateQO> pageQuery) {
        CtContractTemplateQO ctContractTemplateQO = PageQueryUtil.getPageParam(pageQuery, CtContractTemplateQO::new);

        /*
         * 模糊查询条件
         */
        LambdaQueryWrapper<CtContractTemplate> contractTemplateLQW = new LambdaQueryWrapper<>();

        contractTemplateLQW.like(StrUtil.isNotBlank(ctContractTemplateQO.getContractTemplateCodeByLike()),
                CtContractTemplate::getContractTemplateCode,
                ctContractTemplateQO.getContractTemplateCodeByLike());
        contractTemplateLQW.like(StrUtil.isNotBlank(ctContractTemplateQO.getContractTemplateNameByLike()),
                CtContractTemplate::getContractTemplateName,
                ctContractTemplateQO.getContractTemplateNameByLike());

        contractTemplateLQW.orderByAsc(CtContractTemplate::getSort);

        Page<CtContractTemplate> contractTemplatePage = ctContractTemplateService.page(pageQuery.toPage(), contractTemplateLQW);

        PageQuery<CtContractTemplateVO> contractTemplateVOPage = PageQueryUtil.toPageQuery(contractTemplatePage, CtContractTemplateVO::new);

        return contractTemplateVOPage;
    }


    /**
     * 新增合同模板
     *
     * @param ctContractTemplateDO 实体
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    public Boolean createContractTemplate(CtContractTemplateDO ctContractTemplateDO) {
        CtContractTemplate ctContractTemplate = new CtContractTemplate();
        BeanUtils.copyProperties(ctContractTemplate, ctContractTemplate);

        boolean roleSaveResult = ctContractTemplateService.save(ctContractTemplate);
        if (!roleSaveResult) {
            throw new BusinessException("新增合同模板失败");
        }
        return true;
    }

    /**
     * 修改合同模板
     *
     * @param ctContractTemplateDO 实体
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    public Boolean modifyContractTemplate(CtContractTemplateDO ctContractTemplateDO) {
        CtContractTemplate ctContractTemplate = new CtContractTemplate();
        BeanUtils.copyProperties(ctContractTemplate, ctContractTemplate);

        boolean result = ctContractTemplateService.updateById(ctContractTemplate);
        if (!result) {
            throw new BusinessException("修改合同模板失败");
        }

        return true;
    }

    /**
     * 开启、关闭合同模板有效状态
     *
     * @param id 合同模板ID
     * @return
     */
    public Boolean enabledContractTemplateStateById(String id) {
        CtContractTemplate ctContractTemplate = ctContractTemplateService.getById(id);
        if (Objects.isNull(ctContractTemplate)) {
            throw new BusinessException("合同模板不存在");
        }

        if (ContractConstants.DICT_STATE_ID_YES.equals(ctContractTemplate.getStateId())) {
            ctContractTemplate.setStateId(0);
        } else {
            ctContractTemplate.setStateId(1);
        }

        boolean result = ctContractTemplateService.updateById(ctContractTemplate);
        if (!result) {
            throw new BusinessException("修改合同模板状态失败");
        }
        return true;
    }

    /**
     * 删除合同模板
     *
     * @param id 合同模板ID
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    public boolean removeContractTemplateById(String id) {
        boolean result = ctContractTemplateService.removeById(id);
        if (!result) {
            throw new BusinessException("删除合同模板失败");
        }
        return true;
    }
}
